home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 014 / markatrb.arc / MARK.ASM next >
Assembly Source File  |  1985-11-16  |  7KB  |  263 lines

  1.     name    mark
  2.     page    55,132
  3.     title    'MARK --- set attribute of file'
  4. ;
  5. ; MARK --- Utility to set attribute of file.
  6. ;
  7. ; Requires PC-DOS 2.0 or higher for execution.
  8. ;
  9. ; Program is called by command of the form: 
  10. ;
  11. ;     A>MARK path\file.ext /x
  12. ;
  13. ; where x=A for Archive, H for hidden, R for read-only,
  14. ; or N for normal (all attrib bits off).  
  15. ;
  16. ; Copyright (c) 1985 Charles C. Caro
  17. ;
  18. ; May be freely modified and reproduced
  19. ; for non-commercial use.
  20. ;
  21.  
  22. cr    equ    0dh        ;ASCII carriage return
  23. lf    equ    0ah        ;ASCII line feed
  24. eom    equ    '$'        ;end of message flag 
  25.  
  26. command    equ    80h        ;Command line buffer
  27.  
  28. rd_only    equ     01h        ;file attributes
  29. hidden    equ    02h        
  30. system    equ    04h
  31. volume    equ    08h
  32. subdir    equ    10h
  33. archive    equ    20h
  34.  
  35.  
  36. cseg    segment    para public 'CODE'
  37.  
  38.     assume    cs:cseg,ds:data,es:data,ss:stack
  39.  
  40. mark    proc    far        ;entry point from PC-DOS
  41.  
  42.     push    ds        ;save DS:0000 for final
  43.     xor    ax,ax        ;return to PC-DOS
  44.     push    ax
  45.     mov    ax,data        ;make our data segment addressable
  46.     mov    es,ax        ;via the ES register
  47.     call    infile        ;get path and name for
  48.                 ;file to be modified. 
  49.     jnc    mark1        ;jump if filename was ok
  50.     mov    dx,offset msg1    ;filename absent or illegal,
  51.     call    error        ;print error message and exit
  52.     ret
  53.  
  54. mark1:                ;filename was ok, now try
  55.     call    get_switch    ;and find the switch
  56.     jnc    mark2        ;jump if switch was ok
  57.     mov    dx,offset msg7    ;missing switch, print error
  58.     call    error        ;message and exit
  59.     ret            
  60.  
  61. mark2:                ;found legal switch, now 
  62.     push    dx        ;save addr of success message
  63.     mov    ax,es        ;make our data segment addressable
  64.     mov    ds,ax        ;via the DS register
  65.                 ;CX=attrib bits, 
  66.                 ; already set by "get_switch"
  67.                 ;DS:DX=addr of filename
  68.     mov    dx,offset input_name
  69.     mov    ah,43h        ;function 43h=CHMOD
  70.     mov     al,01        ;AL=01 for set attrib
  71.     int    21h        ;make request to PC-DOS
  72.     jnc    mark3        ;if CY=0 jump, successful call
  73.                 ;if CY=1 call failed,     
  74.     pop    dx        ;clean up stack, and
  75.     mov    dx,offset msg2    ;print error message
  76.     call    error
  77.     ret
  78.  
  79. mark3:                ;attribute was modified,
  80.     mov    dx,offset msg3    ;print 1st part of success message
  81.     mov    ah,9
  82.     int    21h
  83.                 ;print filename
  84.     mov    dx,offset input_name
  85.     call    pasciiz 
  86.     pop    dx        ;print last part of success msg.
  87.           mov    ah,9        
  88.     int    21h        
  89.     
  90.     ret            ;final exit to PC-DOS
  91. mark    endp
  92.  
  93. pasciiz    proc    near        ;print the ASCIIZ string
  94.                 ;whose offset is in DX on
  95.                 ;the standard output device.
  96.                 ;Regs AX, BX also destroyed.
  97.     mov    bx,dx        ;let BX=offset of string
  98. pasciiz1:
  99.     mov    dl,[bx]        ;get next char from string
  100.     or    dl,dl        ;if char.=zero,end of string
  101.     jz    pasciiz9    ;jump if end
  102.     cmp    dl,'A'        ;if it is an upper-case alpha
  103.     jb    pasciiz2    ;character,fold to lower case
  104.     cmp    dl,'Z'        ;Note: Inclusive Or of an alpha
  105.     ja    pasciiz2    ;ASCII character with 20h has the
  106.     or    dl,20h        ;effect of folding to lower case.
  107. pasciiz2:
  108.     mov    ah,2        ;function 2=output char.
  109.     int    21h        ;request output by PC-DOS
  110.     inc    bx        ;advance to next string position
  111.     jmp    short pasciiz1
  112. pasciiz9:            ;done with string output,
  113.     ret            ;return to caller
  114. pasciiz endp
  115.  
  116. infile    proc    near        ;Capture the name of a file
  117.                 ;from the command tail buffer
  118.                 ;where it was left by PC-DOS,
  119.                 ;transferring it into a local
  120.                 ;buffer in the form of an
  121.                 ;ASCIIZ string.
  122.  
  123.                 ;DS:SI <-  addr of command tail
  124.     mov    si,offset command
  125.                 ;ES:DI <-  addr of local buffer
  126.     mov    di,offset input_name
  127.     cld            ;make sure direction flag cleared
  128.     lodsb            ;first check count byte to make
  129.     or    al,al        ;sure command tail is present
  130.     jz    infile4        ;return error status if not.
  131. infile1:            ;scan over leading blanks to
  132.     lodsb            ;find the path and filename
  133.     cmp    al,cr        ;if we run into carriage return,
  134.     jz    infile4        ;filename is missing so exit.
  135.     cmp    al,20h        ;if this char is a blank,
  136.     jz    infile1        ;keep scanning.
  137. infile2:            ;found 1st char of name, 
  138.     stosb            ;transfer the name to local buffer.
  139.     lodsb            ;check next character, found
  140.     cmp    al,cr        ;end of string yet?
  141.     je    infile3        ;yes if either carriage return
  142.     cmp    al,20h     
  143.     jne    infile2
  144. infile3:            ;path and filename successfully 
  145.     xor    al,al        ;transferred to local buffer,
  146.     stosb            ;store 0 byte at end of string
  147.     clc            ;and exit with Carry flag =0
  148.     ret
  149. infile4:            ;some type of error was detected
  150.     stc            ;so exit with Carry flag =1
  151.     ret
  152. infile    endp
  153.  
  154.  
  155. get_switch proc    near        ;Scan the input line for a "/"
  156.                 ;delimiting a switch, then make
  157.                 ;sure it is legal.  
  158.                 ;Return CY=0 if legal switch, and
  159.                 ;CX=attrib byte, DX=msg addr
  160.                 ;Return CY=1 if switch no good 
  161.     mov    si,offset command+1  ; DS:SI = addr of command line
  162. get_switch1:            ;look for "/" character
  163.     lodsb
  164.     cmp    al,cr        ;if we run into a carriage return,
  165.     jz    get_switch9     ;switch missing so take error exit.
  166.     cmp    al,'/'    
  167.     jne    get_switch1    ;not '/' yet, keep looking.
  168.     lodsb            ;found '/', pick up next char.
  169.     or    al,20h        ;and fold to lower case.
  170.     cmp    al,'r'        ;R = read only
  171.     jne    get_switch2     ;not R, jump
  172.     mov    cx,rd_only    ;R so set read only attrib bit
  173.     mov    dx,offset msg5
  174.     ret            ;return CY=0 for success
  175. get_switch2:            ;check for H=hidden
  176.     cmp    al,'h'
  177.     jne    get_switch3    ;not H, jump
  178.     mov    cx,hidden    ;H so set hidden attrib bit
  179.     mov    dx,offset msg4
  180.     ret            ;return CY=0 for success
  181. get_switch3:            ;check for N=normal
  182.     cmp    al,'n'
  183.     jne    get_switch4    ;not N,jump
  184.     mov    cx,0        ;clear all attrib bits
  185.     mov    dx,offset msg6
  186.     ret            ;return CY=0 for success
  187. get_switch4:            ;check for A=Archive
  188.     cmp    al,'a'
  189.     jne    get_switch9    ;not A,jump to error exit
  190.     mov    cx,archive    ;A so set archive attrib bit
  191.     mov    dx,offset msg8
  192.     ret            ;return CY=0 for success
  193. get_switch9:            ;missing or illegal switch,
  194.     stc            ;return CY flag=1 as alarm
  195.     ret
  196. get_switch endp
  197.  
  198.  
  199. error    proc    near        ;print error message
  200.     mov    ax,data        ;make sure data area addressable
  201.     mov    ds,ax
  202.     mov    ah,9        ;print error type
  203.     int    21h
  204.     mov    dx,offset helpmsg
  205.     mov    ah,9        ;also print HELP information
  206.     int    21h
  207.     ret            ;back to caller
  208. error    endp
  209.  
  210.  
  211. cseg    ends
  212.  
  213.  
  214.                 ;declare a data segment for
  215.                 ;storage of miscellaneous
  216.                 ;constants and variables
  217. data    segment    para public 'DATA'
  218.  
  219. input_name db    64 dup (0)    ;buffer for path and file name
  220.  
  221. msg1    db    cr,lf
  222.     db    'Missing file name.',eom
  223.  
  224. msg2    db    cr,lf
  225.     db    'File not found.',eom
  226.  
  227. msg3    db    cr,lf
  228.     db    'Attribute of file ',eom
  229.  
  230. msg4    db    ' has been set to Hidden.'
  231.     db    cr,lf,eom
  232.  
  233. msg5    db    ' has been set to Read-Only.'
  234.     db    cr,lf,eom
  235.  
  236. msg6    db    ' has been set to Normal.'
  237.     db    cr,lf,eom
  238.  
  239. msg7    db    cr,lf
  240.     db    'Missing or illegal switch.',eom
  241.  
  242. msg8    db    ' has been set to Archive.'
  243.     db    cr,lf,eom
  244.  
  245. helpmsg    db    '  Command should be in the form: '
  246.     db    cr,lf,lf
  247.     db    '  MARK filename /x'
  248.     db    cr,lf,lf
  249.     db    'x=A for archive, H for hidden, N for normal, R for read-only.'
  250.     db    cr,lf,eom
  251.  
  252. data    ends
  253.  
  254.                 ;declare a stack segment of 64 bytes
  255.                 ;for use as scratch area by such
  256.                 ;instructions as PUSH, POP, CALL, RET 
  257. stack    segment    para stack 'STACK'
  258.     db    64 dup (?) 
  259. stack    ends
  260.  
  261.     end    mark
  262.